#ifndef SYSTEMRESOURCEMONITOR_H
#define SYSTEMRESOURCEMONITOR_H

#include <QtGlobal>
#include <QObject>
#include <QTimer>
#include <QMutex>

/**
 * @brief 系统资源监控器
 * 
 * 负责监控系统资源使用情况，为智能调度提供数据支持
 * 使用Singleton模式确保全局唯一性
 */
class SystemResourceMonitor : public QObject {
    Q_OBJECT
    
public:
    /**
     * @brief 系统资源信息结构体
     */
    struct ResourceInfo {
        int cpuCores;              // CPU核心数
        qint64 totalMemory;        // 总内存（字节）
        qint64 availableMemory;    // 可用内存（字节）
        qint64 usedMemory;         // 已用内存（字节）
        double cpuUsage;           // CPU使用率 (0.0-1.0)
        double memoryUsage;        // 内存使用率 (0.0-1.0)
        qint64 timestamp;          // 采样时间戳
        
        ResourceInfo() : cpuCores(0), totalMemory(0), availableMemory(0), 
                        usedMemory(0), cpuUsage(0.0), memoryUsage(0.0), timestamp(0) {}
    };
    
    /**
     * @brief 获取单例实例
     */
    static SystemResourceMonitor* instance();
    
    /**
     * @brief 获取当前系统资源信息
     * @return 资源信息结构体
     */
    ResourceInfo getCurrentResources();
    
    /**
     * @brief 计算最优线程数量
     * @param taskCount 待处理任务数量
     * @param estimatedMemoryPerTask 每个任务预估内存使用量
     * @return 建议的线程数量
     */
    int getOptimalThreadCount(int taskCount, qint64 estimatedMemoryPerTask);
    
    /**
     * @brief 检查是否有足够资源执行任务
     * @param requiredMemory 所需内存
     * @param requiredCpuUsage 所需CPU使用率
     * @return 是否有足够资源
     */
    bool hasEnoughResources(qint64 requiredMemory, double requiredCpuUsage = 0.8);
    
    /**
     * @brief 启动资源监控
     * @param intervalMs 监控间隔（毫秒）
     */
    void startMonitoring(int intervalMs = 1000);
    
    /**
     * @brief 停止资源监控
     */
    void stopMonitoring();
    
    /**
     * @brief 设置资源警告阈值
     * @param cpuThreshold CPU使用率警告阈值
     * @param memoryThreshold 内存使用率警告阈值
     */
    void setWarningThresholds(double cpuThreshold, double memoryThreshold);

signals:
    /**
     * @brief 资源状态更新信号
     * @param info 最新的资源信息
     */
    void resourceUpdated(const ResourceInfo& info);
    
    /**
     * @brief 资源警告信号
     * @param message 警告消息
     * @param info 当前资源信息
     */
    void resourceWarning(const QString& message, const ResourceInfo& info);

private slots:
    void updateResources();

private:
    explicit SystemResourceMonitor(QObject* parent = nullptr);
    ~SystemResourceMonitor();
    
    // 单例实例
    static SystemResourceMonitor* s_instance;
    static QMutex s_mutex;
    
    // 资源监控
    QTimer* m_monitorTimer;
    ResourceInfo m_lastResourceInfo;
    QMutex m_resourceMutex;
    
    // 警告阈值
    double m_cpuWarningThreshold;
    double m_memoryWarningThreshold;
    
    // 平台相关的资源获取方法
    int getCpuCoreCount();
    qint64 getTotalMemory();
    qint64 getAvailableMemory();
    double getCurrentCpuUsage();
    
    // 历史数据（用于计算平均值和趋势）
    QList<ResourceInfo> m_resourceHistory;
    static const int MAX_HISTORY_SIZE = 60; // 保留60个采样点
    
    void updateResourceHistory(const ResourceInfo& info);
    double getAverageCpuUsage(int sampleCount = 5) const;
    double getAverageMemoryUsage(int sampleCount = 5) const;
};

#endif // SYSTEMRESOURCEMONITOR_H
